/*
 * ValueArray.h
 *
 *  Created on: Jan 24, 2014
 *      Author: ik
 */

#ifndef VALUEARRAY_H_
#define VALUEARRAY_H_

#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>

using namespace std;

template <typename T>
class ValueArray
{
	T * _array;
protected:
	int _n;
	int	_indexOfMaxValue;
	ValueArray() : _n(0), _array(NULL), _indexOfMaxValue(-1) {};

public:
	ValueArray(int n) : _n(n), _array(new T[n]), _indexOfMaxValue(-1) { memset(_array, 0, _n*sizeof(T)); };
	ValueArray(const ValueArray<T>& otro) : _n(otro._n), _array(new T[otro._n]), _indexOfMaxValue(otro._indexOfMaxValue) { memcpy(_array, otro._array, _n*sizeof(T)); };
	virtual ~ValueArray();

	virtual const T operator [](int i) const;
	virtual T operator [](int i);
	virtual void setValue(const int i, const T valor);
	virtual void copy(const ValueArray<T>& otro);
	virtual T maxValue();
	virtual const T maxValue() const;
	virtual int capacity() const { return _n; };
	virtual void print() const;
};

template <typename T>
inline const T ValueArray<T>::operator [](const int i) const
{
	return _array[i];
}

template <typename T>
inline T ValueArray<T>::operator [](const int i)
{
	return _array[i];
}

template <typename T>
inline void ValueArray<T>::setValue(const int i, const T valor)
{
	_array[i] = valor;
}

template <typename T>
inline ValueArray<T>::~ValueArray()
{
	if (_array != NULL)
		delete[] _array;
}

template <typename T>
inline void ValueArray<T>::copy(const ValueArray<T>& otro)
{
	memcpy(_array, otro._array, _n*sizeof(T));
	_indexOfMaxValue = otro._indexOfMaxValue;
}

template <typename T>
inline T ValueArray<T>::maxValue()
{
	if (_indexOfMaxValue >= 0)
		return (*this)[_indexOfMaxValue];

	_indexOfMaxValue = 0;
	for (int i = 1; i < _n; i++)
		if ((*this)[_indexOfMaxValue] < (*this)[i])
			_indexOfMaxValue = i;

	return (*this)[_indexOfMaxValue];
}

template <typename T>
inline const T ValueArray<T>::maxValue() const
{
	return (*this)[_indexOfMaxValue];
}

template <typename T>
inline void ValueArray<T>::print() const
{
	for (int i = 0; i < _n; ++i)
		cout << " " << operator [](i);
}

#endif /* VALUEARRAY_H_ */
